<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>javascript 阶段</title>
</head>
<body>


    <script>
        // 对象
        // var o1 = {key: value , key2: value2 }
        // 备注：  value 可以是任意的数据类型
        // string number boolean undefined null symbol
        // object array function


        // 闭包：一个函数可以访问另一个函数作用域的变量。
        //      obj.add          foo
        //      obj.sub          foo

        // 定义函数 返回一个对象
        function foo(){ // 函数作用域1
            var count = 10; // 局部变量(暂时性保留)
            return { // 返回对象
                add: function(){ // 函数作用域2
                    count += 10;
                    return count;// 调用add函数，返回值count的值
                },
                sub: function(){ //  函数作用域2
                    count -= 10;
                    return count;// 调用sub函数，返回值count的值
                }
            }
        }

        // 调用函数 得到一个对象
        var obj = foo();
        console.log(obj);

        // 测试：
        var v1 = obj.add(); console.log(v1);// 20
        var v2 = obj.add(); console.log(v2);// 30

        var v3 = obj.sub(); console.log(v3);// 20
        var v4 = obj.sub(); console.log(v4);// 10


        // 变量冲突(污染)
        // var count = 10;
        // var count = 1;
        // var count = 4;
        // count = null;// 释放变量



        // 闭包：
            // 优点：
                // 把数据变成了私有的,减少变量的冲突
                // 数据可以被保留

            // 缺点: 
                // 内存泄漏,不再使用的变量一直占用内存
                // 浏览器存在的垃圾回收机制,没办法释放变量所占的空间
                // 垃圾回收机制: 浏览器本身就存在的机制.每隔一段时间自动的清除废弃的变量

            // 盲目乱用:
                // 反复创建闭包
                // 双重循环创建闭包

    </script>
</body>
</html>